<?php

namespace app\result;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

/**
 * bs多规格sku商城系统
 * ============================================================================
 * 版权所有 2024-2099 www.alipay168.cn，并保留所有权利。
 * 网站地址: https://www.alipay168.cn
 * ============================================================================
 * Author: 草上飞
 * Email: wei@alipay16.cn
 * QQ: 2719875001
 * Date: 2024/12/17
 * 描述:
 */
class JWTResult
{
    protected $key;

    public function __construct()
    {
        // 使用配置管理器获取配置值
        $this->key = config('tools.jwt.key');
    }

    /**
     * 编码Payload为JWT字符串
     *
     * @param array $payload 要编码的数据
     * @return string 返回编码后的JWT字符串
     */
    public function encode(array $payload): string
    {
        return JWT::encode($payload, $this->key, 'HS256'); // 明确指定签名算法
    }

    /**
     * 解码JWT字符串为Payload对象
     *
     * @param string $token 要解码的JWT字符串
     * @return object 返回解码后的Payload对象
     */
    public function decode(string $token): object
    {
        try {
            // 创建一个Key实例，并使用它来解码JWT
            return JWT::decode($token, new Key($this->key, 'HS256'));
        } catch (\UnexpectedValueException|\DomainException $e) {
            // 捕获可能抛出的不同类型的异常
            throw new \Exception('Invalid token:' . $token, 401);
        } catch (\InvalidArgumentException $e) {
            // 如果提供的不是有效的JWT也会抛出异常
            throw new \Exception('Invalid token format:' . $token, 401);
        }
    }
}
